/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "引擎枚举数据.h"
#include "core/设备内存缓存.h"







enum E_纹理用途 : uint32 {
	e_采样					= 1 << 0,
	e_贮存					= 1 << 1,
	e_转移源				= 1 << 2,
	e_转移目标				= 1 << 3,
	e_暂存附件				= 1 << 4,
	e_颜色附件				= 1 << 5,
	e_深度模板附件			= 1 << 6,
	e_输入附件				= 1 << 7,
	e_SHADING_RATE			= 1 << 8,
	e_FRAGMENT_DENSITY_MAP	= 1 << 9,
	e_短时附件				= 1 << 10,
};


struct EngineAPI_EXPORT S_纹理 {
	std::u16string  m_Name;
	E_MS次数		m_采样;
	E_纹理格式		m_格式;
	E_纹理维度类型	m_类型;
	

	uvec3			m_Size;
	vec3			m_默认颜色;

	uint32		m_用途;
	
	int32       m_纹理坐标计算类型;
	int32		m_TexID;
	uint8		m_Mip;
	
	//S_绘图设备* m_dev;
	S_设备环境		m_Ctx;
	S_结构指针		m_命令缓存;
	S_纹理采样器*	m_采样器;
	//void f_填充纹理(vec4);
	

	void*		m_像素;
	int32		m_通道数量;
	bool		m_其它库加载纹理;
	
	std::string	m_加载的文件路径;

	S_纹理(){
		m_采样 = E_MS次数::e_MS_1;
		m_采样器 = nullptr;

		m_格式 = E_纹理格式::e_tf_RGBA8U_归一化;
		m_默认颜色 = { 1,1,1 };
		m_Size = { 0,0,1 };

		m_纹理坐标计算类型 = 0;
		m_TexID = -1;
		m_Mip = 1;
		m_命令缓存 = nullptr;

		m_像素 = nullptr;
		m_其它库加载纹理 = false;
		m_通道数量 = 0;

	}

	virtual ~S_纹理();
};



EngineAPI_EXPORT S_纹理* f_tex_创建图像纹理(S_设备环境& ctx, uvec3 size, E_纹理格式 格式, E_纹理维度类型 类型, E_MS次数 采样 = E_MS次数::e_MS_1, E_纹理排列 平铺方式 = E_纹理排列::e_瓦片);
EngineAPI_EXPORT S_纹理* f_tex_创建深度纹理(S_设备环境& ctx, uvec3 size, E_MS次数 采样, E_纹理维度类型 类型 = E_纹理维度类型::e_2D, E_纹理格式 格式 = E_纹理格式::e_tf_D32F);

EngineAPI_EXPORT S_纹理* f_tex_创建存储2D纹理(S_设备环境& ctx, uvec3 size, E_纹理格式 格式, uint32 用途, E_MS次数 采样 = E_MS次数::e_MS_1);

S_纹理* f_tex_创建帧缓存图像(S_设备环境& ctx, uvec3 size, E_纹理格式 格式, E_MS次数 采样 = E_MS次数::e_MS_1, uint32 mip = 1);

EngineAPI_EXPORT void f_tex_销毁纹理(S_纹理* tex);
//void f_tex_释放图像(S_纹理* tex);

void f_tex_创建屏幕呈现图像(S_纹理* tex);




EngineAPI_EXPORT void f_tex_填充纹理数据(S_纹理* tex, const uint8* t, uint16 offset, uvec3 dim, S_结构指针 命令缓存 = nullptr, bool 深度纹理 = false);
EngineAPI_EXPORT void f_tex_读取纹理数据(S_纹理* tex, S_板载缓存* 临时缓存, S_结构指针 命令缓存 = nullptr);
EngineAPI_EXPORT void f_tex_转换格式读取纹理数据(S_板载缓存* buf, void* dataPtr, E_纹理格式 源格式, E_纹理格式 目标格式, uint64 num);



EngineAPI_EXPORT bool f_tex_修改大小(S_纹理* tex, uvec3 newSize, bool 修改内存大小);

EngineAPI_EXPORT void f_tex_拷贝(S_结构指针 cmd, S_纹理* 源, S_纹理* 目标);
EngineAPI_EXPORT void f_tex_拷贝(S_结构指针 cmd, S_纹理* 源, S_板载缓存* 目标);


EngineAPI_EXPORT S_纹理* f_tex_创建图像(S_设备环境& ctx, const uvec3& size, E_纹理格式 格式, E_纹理维度类型 类型);

EngineAPI_EXPORT uint32 f_tex_格式通道数量(E_纹理格式 格式);
EngineAPI_EXPORT uvec3 f_tex_分辨率(S_纹理* tex);

EngineAPI_EXPORT void f_tex_改变布局(S_纹理* tex, uvec2 newSize);


void f_tex_渲染布局(S_纹理* tex);
void f_tex_采样布局(S_纹理* tex);
void f_tex_读写布局(S_纹理* tex);

void f_tex_深度渲染布局(S_纹理** tex, uint32 num);
void f_tex_深度采样布局(S_纹理** tex, uint32 num);


EngineAPI_EXPORT void f_纹理集_重置纹理大小(S_纹理集* ts, uint32 loc, uvec2 size);


//EngineAPI_EXPORT void*	f_纹理集_get纹理信息();
//EngineAPI_EXPORT uint32	f_纹理集_get纹理信息数量();





//class EngineAPI_EXPORT C_纹理集 {
//	
//public:
//	C_纹理集() {
//	}
//	~C_纹理集() {
//	}
//
//};


